/**
  ******************************************************************************
  * @file    main.c 
  * @author  18408107475@163.com
  * @version v1.0
  * @date    2025/04/16
  * @brief   STM32双串口通信与LED控制系统
  * @details 
  * 硬件连接：
  * - LED1: PB5 (高电平点亮)
  * - LED2: PE5 (低电平点亮)
  * - USART1: 连接PC串口(调试用)
  * - USART2: 连接外部设备(如蓝牙)
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"      // STM32标准库
#include <stdlib.h>         // 标准库
#include <string.h>         // 字符串处理
#include <stdio.h>          // 标准IO

/* 外设驱动头文件 */
#include "Delay.h"          // 延时函数
#include "LED_STD_Config.h" // LED驱动
#include "USART1_Config.h"  // 串口1驱动
#include "USART2_Config.h"  // 串口2驱动

/* 宏定义 --------------------------------------------------------------------*/
#define BUFSIZE  128        // 串口接收缓冲区大小

/* 全局变量 ------------------------------------------------------------------*/
uint8_t RecBuf[BUFSIZE] = {0};  // 接收缓冲区
uint32_t RecCnt = 0;            // 接收字节计数器

/* 函数声明 ------------------------------------------------------------------*/
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);

/**
  * @brief  USART2中断服务函数
  * @note   接收外部设备数据，字节存储模式
  */
void USART2_IRQHandler(void)
{
    // 检查接收中断标志
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
    {
        // 读取1字节数据（自动清除RXNE标志）
        RecBuf[RecCnt++] = USART_ReceiveData(USART2);  
        
        // 缓冲区溢出保护
        if(RecCnt >= BUFSIZE)
        {
            memset(RecBuf, 0, BUFSIZE); // 清空缓冲区
            RecCnt = 0;                // 重置计数器
        }
    }
}

/**
  * @brief  USART1中断服务函数
  * @note   实现PC数据的透明传输
  */
void USART1_IRQHandler(void)
{
    uint8_t data;

    // 检查接收中断
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)               
    {
        data = USART_ReceiveData(USART1);     // 读取数据
        USART_SendData(USART2, data);         // 转发到USART2
        
        // 等待发送完成
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
    }
}

/**
  ******************************************************************************
  * @brief  主函数
  * @note   系统初始化后进入命令处理循环
  ******************************************************************************
  */
int main(void)
{
    /* 硬件初始化 */
    LED_STD_Config();       // 初始化LED
    USART1_Config(115200);  // 初始化USART1
    USART2_Config(115200);  // 初始化USART2

    /* 主循环 */
    while(1)
    {	
        // 实时转发接收到的数据到PC
        //USART1_SendString((char *)RecBuf);
        
        /* 命令解析与执行 */
        if(strstr((char *)RecBuf,"LED1_OFF")){
            GPIO_SetBits(GPIOB, GPIO_Pin_5);  // 关闭LED1
            memset(RecBuf,0,BUFSIZE);         // 清空缓冲区
            RecCnt = 0;
        }
        if(strstr((char *)RecBuf,"LED1_ON")){
            GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 打开LED1
            memset(RecBuf,0,BUFSIZE);
            RecCnt = 0;
        }
        if(strstr((char *)RecBuf,"LED2_OFF")){
            GPIO_SetBits(GPIOE, GPIO_Pin_5);  // 关闭LED2
            memset(RecBuf,0,BUFSIZE);
            RecCnt = 0;
        }
        if(strstr((char *)RecBuf,"LED2_ON")){
            GPIO_ResetBits(GPIOE, GPIO_Pin_5); // 打开LED2
            memset(RecBuf,0,BUFSIZE);
            RecCnt = 0;
        }
    }
}

/*************************************END OF FILE**************************************/
